package com.blog.cmrpersonalblog.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.blog.cmrpersonalblog.dto.notification.requset.NotificationCreateRequest;
import com.blog.cmrpersonalblog.dto.notification.requset.NotificationQueryRequest;
import com.blog.cmrpersonalblog.dto.notification.respnose.NotificationGroupResponse;
import com.blog.cmrpersonalblog.dto.notification.respnose.NotificationResponse;
import com.blog.cmrpersonalblog.dto.notification.respnose.NotificationStatsResponse;

import java.util.List;

/**
 * 通知服务接口
 */
public interface NotificationService {

    /**
     * 分页查询通知列表
     * @param userId 用户ID
     * @param query 查询条件
     * @return 通知分页列表
     */
    IPage<NotificationResponse> getNotificationPage(Long userId, NotificationQueryRequest query);

    /**
     * 获取通知详情
     * @param notificationId 通知ID
     * @param userId 用户ID
     * @return 通知详情
     */
    NotificationResponse getNotificationDetail(Long notificationId, Long userId);

    /**
     * 获取用户通知统计
     * @param userId 用户ID
     * @return 通知统计
     */
    NotificationStatsResponse getNotificationStats(Long userId);

    /**
     * 获取最新通知列表
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 通知列表
     */
    List<NotificationResponse> getLatestNotifications(Long userId, Integer limit);

    /**
     * 标记通知为已读
     * @param notificationId 通知ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean markAsRead(Long notificationId, Long userId);

    /**
     * 批量标记通知为已读
     * @param notificationIds 通知ID列表
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean batchMarkAsRead(List<Long> notificationIds, Long userId);

    /**
     * 标记所有通知为已读
     * @param userId 用户ID
     * @param type 通知类型（可选）
     * @return 是否成功
     */
    boolean markAllAsRead(Long userId, String type);

    /**
     * 删除通知
     * @param notificationId 通知ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean deleteNotification(Long notificationId, Long userId);

    /**
     * 批量删除通知
     * @param notificationIds 通知ID列表
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean batchDeleteNotifications(List<Long> notificationIds, Long userId);

    /**
     * 清空已读通知
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean clearReadNotifications(Long userId);

    /**
     * 创建通知
     * @param request 创建请求
     * @return 是否成功
     */
    boolean createNotification(NotificationCreateRequest request);

    /**
     * 发送新增粉丝通知
     * @param followerId 关注者ID
     * @param followingId 被关注者ID
     * @return 是否成功
     */
    boolean sendFollowNotification(Long followerId, Long followingId);

    /**
     * 发送点赞通知
     * @param userId 点赞用户ID
     * @param targetId 目标ID（文章ID或评论ID）
     * @param targetType 目标类型（article或comment）
     * @param authorId 作者ID
     * @return 是否成功
     */
    boolean sendLikeNotification(Long userId, Long targetId, String targetType, Long authorId);

    /**
     * 发送收藏通知 (已废弃,不再使用)
     * @param userId 收藏用户ID
     * @param articleId 文章ID
     * @param authorId 作者ID
     * @return 是否成功
     * @deprecated 收藏通知已废弃,不再发送收藏通知
     */
    @Deprecated
    boolean sendCollectNotification(Long userId, Long articleId, Long authorId);

    /**
     * 发送评论通知
     * @param commentId 评论ID
     * @param userId 评论用户ID
     * @param articleId 文章ID
     * @param authorId 文章作者ID
     * @return 是否成功
     */
    boolean sendCommentNotification(Long commentId, Long userId, Long articleId, Long authorId);

    /**
     * 发送回复通知
     * @param commentId 评论ID
     * @param userId 回复用户ID
     * @param replyToUserId 被回复用户ID
     * @param articleId 文章ID
     * @return 是否成功
     */
    boolean sendReplyNotification(Long commentId, Long userId, Long replyToUserId, Long articleId);

    /**
     * 发送@提及通知
     * @param commentId 评论ID
     * @param userId 提及用户ID（发表评论的人）
     * @param mentionedUserIds 被提及的用户ID列表
     * @param articleId 文章ID
     * @return 是否成功
     */
    boolean sendMentionNotification(Long commentId, Long userId, List<Long> mentionedUserIds, Long articleId);

    /**
     * 发送系统通知
     * @param userId 用户ID（null表示发送给所有用户）
     * @param title 通知标题
     * @param content 通知内容
     * @return 是否成功
     */
    boolean sendSystemNotification(Long userId, String title, String content);

    /**
     * 批量发送系统通知
     * @param userIds 用户ID列表
     * @param title 通知标题
     * @param content 通知内容
     * @return 是否成功
     */
    boolean batchSendSystemNotification(List<Long> userIds, String title, String content);

    /**
     * 初始化用户通知统计
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean initUserNotificationStats(Long userId);

    /**
     * 重新计算用户通知统计
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean recalculateUserNotificationStats(Long userId);

    /**
     * 分页查询聚合通知列表
     * @param userId 用户ID
     * @param query 查询条件
     * @return 聚合通知分页列表
     */
    IPage<NotificationGroupResponse> getGroupedNotificationPage(Long userId, NotificationQueryRequest query);

    /**
     * 获取指定分组的通知详情列表
     * @param userId 用户ID
     * @param type 通知类型
     * @param targetType 目标类型
     * @param targetId 目标ID
     * @return 通知详情列表
     */
    List<NotificationResponse> getGroupedNotificationDetails(Long userId, String type, String targetType, Long targetId);

    /**
     * 标记指定分组的所有通知为已读
     * @param userId 用户ID
     * @param type 通知类型
     * @param targetType 目标类型
     * @param targetId 目标ID
     * @return 是否成功
     */
    boolean markGroupAsRead(Long userId, String type, String targetType, Long targetId);
}

